#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <unistd.h>

#define NUM_SUPPLIERS 2
#define NUM_SMOKERS 3

// 共享数据结构
typedef struct {
    int current_combo; // 当前供应的组合索引（0: 烟草+纸，1: 纸+胶水，2: 烟草+胶水）
} SharedData;

// 信号量操作联合体
union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};

// 全局信号量标识符
int mutex_sem;          // 互斥信号量
int smoker_sem[3];      // 抽烟者信号量（索引0-2对应组合0-2）
int supplier_sem;       // 供应者完成信号量

// 初始化信号量
void init_semaphores() {
    key_t key = ftok(".", 'M');
    mutex_sem = semget(key, 1, 0666 | IPC_CREAT);
    union semun arg;
    arg.val = 1;
    semctl(mutex_sem, 0, SETVAL, arg);

    for (int i = 0; i < NUM_SMOKERS; i++) {
        key_t skey = ftok(".", 'S' + i);
        smoker_sem[i] = semget(skey, 1, 0666 | IPC_CREAT);
        arg.val = 0;
        semctl(smoker_sem[i], 0, SETVAL, arg);
    }

    key_t sukey = ftok(".", 'U');
    supplier_sem = semget(sukey, 1, 0666 | IPC_CREAT);
    arg.val = 0;
    semctl(supplier_sem, 0, SETVAL, arg);
}

// P操作
void P(int sem_id) {
    struct sembuf op = {0, -1, 0};
    semop(sem_id, &op, 1);
}

// V操作
void V(int sem_id) {
    struct sembuf op = {0, 1, 0};
    semop(sem_id, &op, 1);
}
